/**
 * Copyright: Copyright (c) 2012
 * Company:深圳市海乐淘电子商务有限公司
 * @author lifuyu
 * @date 2012-4-25 上午9:54:21
 * @version V1.0
 *
 * @Description: 这个是系统通用工具类，定义一些通用的方法
 */
package billing.utils.p;

import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import billing.system.utils.StringUtils;

public class CUtils
{
	// 默认的日期格式
	private static final SimpleDateFormat DEF_DAT_FMT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	// 数字正则
	private static final Pattern re_Number = Pattern.compile("[0-9]+");

	/**
	 * 是否正数
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isInteger(String s)
	{
		if (s == null)
			return false;
		return s.matches("(0|-?[1-9]{1}[0-9]*)");
	}

	/**
	 * 是否价格形式的数字，包括2小数点
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isPriceDecimal(String s)
	{
		if (s == null)
			return false;
		return s.matches("(0|[1-9]{1}[0-9]*)(.[0-9]{1,3})?");
	}

	/**
	 * 转换字符串
	 * 
	 * @author：lifuyu
	 * 
	 * @param obj
	 * @return
	 */
	public static String toStr(Object obj)
	{
		return toStr(obj, false);
	}

	/**
	 * 转换字符串
	 * 
	 * @author：lifuyu
	 * 
	 * @param obj
	 * @return
	 */
	public static String toStr(Object obj, boolean toNull)
	{
		if (obj == null)
			return toNull ? null : "";
		if (obj instanceof String)
			return (String) obj;
		if (obj instanceof Date)
			return DEF_DAT_FMT.format((Date) obj);
		return obj.toString();
	}

	/**
	 * 清除字符串两端空白字符，此方法只针对字符串，否则返回null
	 * 
	 * @author：lifuyu
	 * 
	 * @param obj
	 * @param toNull 如果是空字符串的情况是否返回null
	 * @return
	 */
	public static String trim(Object obj, boolean toNull)
	{
		if (obj == null)
			return toNull ? null : "";
		if (obj instanceof String)
		{
			if (toNull)
				return StringUtils.trimToNull((String) obj);
			else
				return StringUtils.trimToEmpty((String) obj);
		}
		else
		{
			String _v = String.valueOf(obj);
			return "null".equals(_v) ? toNull ? null : "" : _v;
		}
	}

	/**
	 * 清除字符串两端空白字符，此方法只针对字符串，否则返回null
	 * 
	 * @Description: TODO
	 * @author：lifuyu
	 * 
	 * @param obj
	 * @return
	 */
	public static String trim(Object obj)
	{
		return trim(obj, false);
	}

	/**
	 * 判断对象是否为空
	 * 
	 * @author：lifuyu
	 * 
	 * @param obj
	 * @return
	 */
	public static boolean isEmpty(Object obj)
	{
		if (obj == null)
			return true;
		if (obj instanceof String)
			return StringUtils.isBlank((String) obj);
		if (obj instanceof Map)
			return ((Map<?, ?>) obj).isEmpty();
		if (obj instanceof Collection)
			return ((Collection<?>) obj).isEmpty();
		if (obj instanceof Set)
			return ((Set<?>) obj).isEmpty();
		if (obj instanceof Object[])
			return ((Object[]) obj).length == 0;
		return false;
	}

	public static boolean isNotEmpty(Object obj)
	{
		return !isEmpty(obj);
	}

	/**
	 * 截断字符串
	 * 
	 * @author：lifuyu
	 * 
	 * @param s
	 * @param n
	 * @return
	 */
	public static String substr(String s, int n)
	{
		if (s == null)
			return s;
		int l = s.length();
		if (l >= n)
			return s.substring(0, l);
		else
			return s;
	}

	/**
	 * 判断是否是数字
	 * 
	 * @author：lifuyu
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNumber(String s)
	{
		if (s == null)
			return false;
		Matcher isNum = re_Number.matcher(s);
		return isNum.matches();
	}

	/**
	 * 此方法主要是为格式化库位编码,为库位排序所用
	 * 
	 * @author：lifuyu
	 * 
	 * @param str
	 * @param preLen
	 * @return
	 */
	public static String gapWHCStr(String str, int preLen)
	{
		if (isEmpty(str))
			return "";
		StringBuffer sb = new StringBuffer();
		int len = str.length();
		int p1 = 0;
		do
		{
			int p2 = str.indexOf("-", p1);
			p2 = p2 == -1 ? len : p2;

			String s = str.substring(p1, p2);
			if (!isNumber(s))
				sb.append(s);
			for (int i = s.length(); i < preLen; i++)
			{
				sb.append("0");
			}
			if (isNumber(s))
				sb.append(s);
			p1 = p2 + 1;
			if (p1 >= len)
				break;
			sb.append("-");
		} while (true);

		return sb.toString();
	}

	/**
	 * 校验提交过来的数据是否完整
	 * 
	 * @author：lifuyu
	 * 
	 * @param o
	 * @return
	 */
//	public static boolean validateBeanValue(Object bean, String[] fields)
//	{
//		if (bean == null || fields == null || fields.length == 0)
//			return false;
//		for (String field : fields)
//		{
//			if (isEmpty(field))
//				continue;
//			Object val = null;
//			try
//			{
//				val = BeanUtils.getAnyProp(bean, field);
//			}
//			catch (Exception e)
//			{
//				e.printStackTrace();
//			}
//			if (isEmpty(val))
//				return false;
//		}
//		return true;
//	}

	/**
	 * 产生序列号
	 * 
	 * @author：lifuyu
	 * 
	 * @return
	 */
//	public static String genSerialNo()
//	{
//		String rndNo = String.valueOf((int) (new Random().nextDouble() * 9999));
//		rndNo = "0000".substring(0, 4 - rndNo.length()) + rndNo;
//		String serialNo = DateTimeUtils.convertToString(new Date(), DateTimeUtils.FMT_YYYYMMDDHHMMSS_S_SEQ);
//		return serialNo + rndNo;
//	}

	/**
	 * 从列表里获取匹配的对象
	 * 
	 * @author：lifuyu
	 * 
	 * @param list
	 * @param prop
	 * @param value
	 * @return
	 */
//	public static Object getMatchFromList(List<?> list, String prop, String value)
//	{
//		if (isEmpty(list) || value==null)
//			return null;
//
//		for (Object obj : list)
//		{
//			String v = null;
//			try
//			{
//				v = BeanUtils.getAnyProp(obj, prop);
//			}
//			catch (Exception e)
//			{
//				e.printStackTrace();
//			}
//			if (v.equals(value))
//				return obj;
//		}
//		return null;
//	}

	/**
	 * 例如fine_name格式化成fineName
	 * 
	 * @author：lifuyu
	 * @param fieldName
	 * @return
	 */
	public static String fmtFiledName(String fieldName)
	{
		if (fieldName == null)
			return null;
		Pattern p = Pattern.compile("(_.{1})");
		// 用 Pattern 类的 matcher() 方法生成一个 Matcher 对象
		Matcher m = p.matcher(fieldName);
		StringBuffer sb = new StringBuffer();
		// 使用 find() 方法查找第一个匹配的对象
		boolean result = m.find();
		// 使用循环将句子里所有的 kelvin 找出并替换再将内容加到 sb 里
		while (result)
		{
			m.appendReplacement(sb, m.group().substring(1).toUpperCase());
			// 继续查找下一个匹配对象
			result = m.find();
		}
		// 最后调用 appendTail() 方法将最后一次匹配后的剩余字符串加到 sb 里；
		m.appendTail(sb);

		return sb.toString();
	}
}
